home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / lib / python2.5 / imputil.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-29  |  16KB  |  550 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.5)
  3.  
  4. '''
  5. Import utilities
  6.  
  7. Exported classes:
  8.     ImportManager   Manage the import process
  9.  
  10.     Importer        Base class for replacing standard import functions
  11.     BuiltinImporter Emulate the import mechanism for builtin and frozen modules
  12.  
  13.     DynLoadSuffixImporter
  14. '''
  15. import imp
  16. import sys
  17. import __builtin__
  18. import struct
  19. import marshal
  20. __all__ = [
  21.     'ImportManager',
  22.     'Importer',
  23.     'BuiltinImporter']
  24. _StringType = type('')
  25. _ModuleType = type(sys)
  26.  
  27. class ImportManager:
  28.     '''Manage the import process.'''
  29.     
  30.     def install(self, namespace = vars(__builtin__)):
  31.         '''Install this ImportManager into the specified namespace.'''
  32.         if isinstance(namespace, _ModuleType):
  33.             namespace = vars(namespace)
  34.         
  35.         self.previous_importer = namespace['__import__']
  36.         self.namespace = namespace
  37.         namespace['__import__'] = self._import_hook
  38.  
  39.     
  40.     def uninstall(self):
  41.         '''Restore the previous import mechanism.'''
  42.         self.namespace['__import__'] = self.previous_importer
  43.  
  44.     
  45.     def add_suffix(self, suffix, importFunc):
  46.         if not callable(importFunc):
  47.             raise AssertionError
  48.         self.fs_imp.add_suffix(suffix, importFunc)
  49.  
  50.     clsFilesystemImporter = None
  51.     
  52.     def __init__(self, fs_imp = None):
  53.         if not _os_stat:
  54.             _os_bootstrap()
  55.         
  56.         if fs_imp is None:
  57.             if not self.clsFilesystemImporter:
  58.                 pass
  59.             cls = _FilesystemImporter
  60.             fs_imp = cls()
  61.         
  62.         self.fs_imp = fs_imp
  63.         for desc in imp.get_suffixes():
  64.             if desc[2] == imp.C_EXTENSION:
  65.                 self.add_suffix(desc[0], DynLoadSuffixImporter(desc).import_file)
  66.                 continue
  67.         
  68.         self.add_suffix('.py', py_suffix_importer)
  69.  
  70.     
  71.     def _import_hook(self, fqname, globals = None, locals = None, fromlist = None):
  72.         '''Python calls this hook to locate and import a module.'''
  73.         parts = fqname.split('.')
  74.         parent = self._determine_import_context(globals)
  75.         if parent:
  76.             module = parent.__importer__._do_import(parent, parts, fromlist)
  77.             if module:
  78.                 return module
  79.             
  80.         
  81.         
  82.         try:
  83.             top_module = sys.modules[parts[0]]
  84.         except KeyError:
  85.             top_module = self._import_top_module(parts[0])
  86.             if not top_module:
  87.                 raise ImportError, 'No module named ' + fqname
  88.             
  89.         except:
  90.             top_module
  91.  
  92.         if len(parts) == 1:
  93.             if not fromlist:
  94.                 return top_module
  95.             
  96.             if not top_module.__dict__.get('__ispkg__'):
  97.                 return top_module
  98.             
  99.         
  100.         importer = top_module.__dict__.get('__importer__')
  101.         if importer:
  102.             return importer._finish_import(top_module, parts[1:], fromlist)
  103.         
  104.         if len(parts) == 2 and hasattr(top_module, parts[1]):
  105.             if fromlist:
  106.                 return getattr(top_module, parts[1])
  107.             else:
  108.                 return top_module
  109.         
  110.         raise ImportError, 'No module named ' + fqname
  111.  
  112.     
  113.     def _determine_import_context(self, globals):
  114.         '''Returns the context in which a module should be imported.
  115.  
  116.         The context could be a loaded (package) module and the imported module
  117.         will be looked for within that package. The context could also be None,
  118.         meaning there is no context -- the module should be looked for as a
  119.         "top-level" module.
  120.         '''
  121.         if not globals or not globals.get('__importer__'):
  122.             return None
  123.         
  124.         parent_fqname = globals['__name__']
  125.         if globals['__ispkg__']:
  126.             parent = sys.modules[parent_fqname]
  127.             if not globals is parent.__dict__:
  128.                 raise AssertionError
  129.             return parent
  130.         
  131.         i = parent_fqname.rfind('.')
  132.         if i == -1:
  133.             return None
  134.         
  135.         parent_fqname = parent_fqname[:i]
  136.         parent = sys.modules[parent_fqname]
  137.         if not parent.__name__ == parent_fqname:
  138.             raise AssertionError
  139.         return parent
  140.  
  141.     
  142.     def _import_top_module(self, name):
  143.         for item in sys.path:
  144.             if isinstance(item, _StringType):
  145.                 module = self.fs_imp.import_from_dir(item, name)
  146.             else:
  147.                 module = item.import_top(name)
  148.             if module:
  149.                 return module
  150.                 continue
  151.         
  152.  
  153.     
  154.     def _reload_hook(self, module):
  155.         '''Python calls this hook to reload a module.'''
  156.         importer = module.__dict__.get('__importer__')
  157.         if not importer:
  158.             pass
  159.         
  160.         raise SystemError, 'reload not yet implemented'
  161.  
  162.  
  163.  
  164. class Importer:
  165.     '''Base class for replacing standard import functions.'''
  166.     
  167.     def import_top(self, name):
  168.         '''Import a top-level module.'''
  169.         return self._import_one(None, name, name)
  170.  
  171.     
  172.     def _finish_import(self, top, parts, fromlist):
  173.         bottom = self._load_tail(top, parts)
  174.         if not fromlist:
  175.             return top
  176.         
  177.         if bottom.__ispkg__:
  178.             self._import_fromlist(bottom, fromlist)
  179.         
  180.         return bottom
  181.  
  182.     
  183.     def _import_one(self, parent, modname, fqname):
  184.         '''Import a single module.'''
  185.         
  186.         try:
  187.             return sys.modules[fqname]
  188.         except KeyError:
  189.             pass
  190.  
  191.         result = self.get_code(parent, modname, fqname)
  192.         if result is None:
  193.             return None
  194.         
  195.         module = self._process_result(result, fqname)
  196.         if parent:
  197.             setattr(parent, modname, module)
  198.         
  199.         return module
  200.  
  201.     
  202.     def _process_result(self, .1, fqname):
  203.         (ispkg, code, values) = .1
  204.         is_module = isinstance(code, _ModuleType)
  205.         if is_module:
  206.             module = code
  207.         else:
  208.             module = imp.new_module(fqname)
  209.         module.__importer__ = self
  210.         module.__ispkg__ = ispkg
  211.         module.__dict__.update(values)
  212.         sys.modules[fqname] = module
  213.         if not is_module:
  214.             
  215.             try:
  216.                 exec code in module.__dict__
  217.             if fqname in sys.modules:
  218.                 del sys.modules[fqname]
  219.             
  220.  
  221.             raise 
  222.         
  223.         is_module
  224.         module = sys.modules[fqname]
  225.         module.__name__ = fqname
  226.         return module
  227.  
  228.     
  229.     def _load_tail(self, m, parts):
  230.         '''Import the rest of the modules, down from the top-level module.
  231.  
  232.         Returns the last module in the dotted list of modules.
  233.         '''
  234.         for part in parts:
  235.             fqname = '%s.%s' % (m.__name__, part)
  236.             m = self._import_one(m, part, fqname)
  237.             if not m:
  238.                 raise ImportError, 'No module named ' + fqname
  239.                 continue
  240.         
  241.         return m
  242.  
  243.     
  244.     def _import_fromlist(self, package, fromlist):
  245.         '''Import any sub-modules in the "from" list.'''
  246.         if '*' in fromlist:
  247.             fromlist = list(fromlist) + list(package.__dict__.get('__all__', []))
  248.         
  249.         for sub in fromlist:
  250.             if sub != '*' and not hasattr(package, sub):
  251.                 subname = '%s.%s' % (package.__name__, sub)
  252.                 submod = self._import_one(package, sub, subname)
  253.                 if not submod:
  254.                     raise ImportError, 'cannot import name ' + subname
  255.                 
  256.             submod
  257.         
  258.  
  259.     
  260.     def _do_import(self, parent, parts, fromlist):
  261.         '''Attempt to import the module relative to parent.
  262.  
  263.         This method is used when the import context specifies that <self>
  264.         imported the parent module.
  265.         '''
  266.         top_name = parts[0]
  267.         top_fqname = parent.__name__ + '.' + top_name
  268.         top_module = self._import_one(parent, top_name, top_fqname)
  269.         if not top_module:
  270.             return None
  271.         
  272.         return self._finish_import(top_module, parts[1:], fromlist)
  273.  
  274.     
  275.     def get_code(self, parent, modname, fqname):
  276.         '''Find and retrieve the code for the given module.
  277.  
  278.         parent specifies a parent module to define a context for importing. It
  279.         may be None, indicating no particular context for the search.
  280.  
  281.         modname specifies a single module (not dotted) within the parent.
  282.  
  283.         fqname specifies the fully-qualified module name. This is a
  284.         (potentially) dotted name from the "root" of the module namespace
  285.         down to the modname.
  286.         If there is no parent, then modname==fqname.
  287.  
  288.         This method should return None, or a 3-tuple.
  289.  
  290.         * If the module was not found, then None should be returned.
  291.  
  292.         * The first item of the 2- or 3-tuple should be the integer 0 or 1,
  293.             specifying whether the module that was found is a package or not.
  294.  
  295.         * The second item is the code object for the module (it will be
  296.             executed within the new module\'s namespace). This item can also
  297.             be a fully-loaded module object (e.g. loaded from a shared lib).
  298.  
  299.         * The third item is a dictionary of name/value pairs that will be
  300.             inserted into new module before the code object is executed. This
  301.             is provided in case the module\'s code expects certain values (such
  302.             as where the module was found). When the second item is a module
  303.             object, then these names/values will be inserted *after* the module
  304.             has been loaded/initialized.
  305.         '''
  306.         raise RuntimeError, 'get_code not implemented'
  307.  
  308.  
  309. if not __debug__ or 'c':
  310.     pass
  311. _suffix_char = 'o'
  312. _suffix = '.py' + _suffix_char
  313.  
  314. def _compile(pathname, timestamp):
  315.     """Compile (and cache) a Python source file.
  316.  
  317.     The file specified by <pathname> is compiled to a code object and
  318.     returned.
  319.  
  320.     Presuming the appropriate privileges exist, the bytecodes will be
  321.     saved back to the filesystem for future imports. The source file's
  322.     modification timestamp must be provided as a Long value.
  323.     """
  324.     codestring = open(pathname, 'rU').read()
  325.     if codestring and codestring[-1] != '\n':
  326.         codestring = codestring + '\n'
  327.     
  328.     code = __builtin__.compile(codestring, pathname, 'exec')
  329.     
  330.     try:
  331.         f = open(pathname + _suffix_char, 'wb')
  332.     except IOError:
  333.         pass
  334.  
  335.     f.write('\x00\x00\x00\x00')
  336.     f.write(struct.pack('<I', timestamp))
  337.     marshal.dump(code, f)
  338.     f.flush()
  339.     f.seek(0, 0)
  340.     f.write(imp.get_magic())
  341.     f.close()
  342.     return code
  343.  
  344. _os_stat = None
  345. _os_path_join = None
  346.  
  347. def _os_bootstrap():
  348.     """Set up 'os' module replacement functions for use during import bootstrap."""
  349.     global _os_stat, _os_path_join
  350.     names = sys.builtin_module_names
  351.     join = None
  352.     if 'posix' in names:
  353.         sep = '/'
  354.         stat = stat
  355.         import posix
  356.     elif 'nt' in names:
  357.         sep = '\\'
  358.         stat = stat
  359.         import nt
  360.     elif 'dos' in names:
  361.         sep = '\\'
  362.         stat = stat
  363.         import dos
  364.     elif 'os2' in names:
  365.         sep = '\\'
  366.         stat = stat
  367.         import os2
  368.     elif 'mac' in names:
  369.         stat = stat
  370.         import mac
  371.         
  372.         def join(a, b):
  373.             if a == '':
  374.                 return b
  375.             
  376.             if ':' not in a:
  377.                 a = ':' + a
  378.             
  379.             if a[-1:] != ':':
  380.                 a = a + ':'
  381.             
  382.             return a + b
  383.  
  384.     else:
  385.         raise ImportError, 'no os specific module found'
  386.     if join is None:
  387.         
  388.         def join(a, b, sep = sep):
  389.             if a == '':
  390.                 return b
  391.             
  392.             lastchar = a[-1:]
  393.             if lastchar == '/' or lastchar == sep:
  394.                 return a + b
  395.             
  396.             return a + sep + b
  397.  
  398.     
  399.     _os_stat = stat
  400.     _os_path_join = join
  401.  
  402.  
  403. def _os_path_isdir(pathname):
  404.     '''Local replacement for os.path.isdir().'''
  405.     
  406.     try:
  407.         s = _os_stat(pathname)
  408.     except OSError:
  409.         return None
  410.  
  411.     return s.st_mode & 61440 == 16384
  412.  
  413.  
  414. def _timestamp(pathname):
  415.     '''Return the file modification time as a Long.'''
  416.     
  417.     try:
  418.         s = _os_stat(pathname)
  419.     except OSError:
  420.         return None
  421.  
  422.     return long(s.st_mtime)
  423.  
  424.  
  425. class BuiltinImporter(Importer):
  426.     
  427.     def get_code(self, parent, modname, fqname):
  428.         if parent:
  429.             return None
  430.         
  431.         if imp.is_builtin(modname):
  432.             type = imp.C_BUILTIN
  433.         elif imp.is_frozen(modname):
  434.             type = imp.PY_FROZEN
  435.         else:
  436.             return None
  437.         module = imp.load_module(modname, None, modname, ('', '', type))
  438.         return (0, module, { })
  439.  
  440.  
  441.  
  442. class _FilesystemImporter(Importer):
  443.     
  444.     def __init__(self):
  445.         self.suffixes = []
  446.  
  447.     
  448.     def add_suffix(self, suffix, importFunc):
  449.         if not callable(importFunc):
  450.             raise AssertionError
  451.         self.suffixes.append((suffix, importFunc))
  452.  
  453.     
  454.     def import_from_dir(self, dir, fqname):
  455.         result = self._import_pathname(_os_path_join(dir, fqname), fqname)
  456.         if result:
  457.             return self._process_result(result, fqname)
  458.         
  459.  
  460.     
  461.     def get_code(self, parent, modname, fqname):
  462.         if not parent:
  463.             raise AssertionError
  464.         for submodule_path in parent.__path__:
  465.             code = self._import_pathname(_os_path_join(submodule_path, modname), fqname)
  466.             if code is not None:
  467.                 return code
  468.                 continue
  469.         
  470.         return self._import_pathname(_os_path_join(parent.__pkgdir__, modname), fqname)
  471.  
  472.     
  473.     def _import_pathname(self, pathname, fqname):
  474.         if _os_path_isdir(pathname):
  475.             result = self._import_pathname(_os_path_join(pathname, '__init__'), fqname)
  476.             if result:
  477.                 values = result[2]
  478.                 values['__pkgdir__'] = pathname
  479.                 values['__path__'] = [
  480.                     pathname]
  481.                 return (1, result[1], values)
  482.             
  483.             return None
  484.         
  485.         for suffix, importFunc in self.suffixes:
  486.             filename = pathname + suffix
  487.             
  488.             try:
  489.                 finfo = _os_stat(filename)
  490.             except OSError:
  491.                 continue
  492.  
  493.             return importFunc(filename, finfo, fqname)
  494.         
  495.  
  496.  
  497.  
  498. def py_suffix_importer(filename, finfo, fqname):
  499.     file = filename[:-3] + _suffix
  500.     t_py = long(finfo[8])
  501.     t_pyc = _timestamp(file)
  502.     code = None
  503.     if t_pyc is not None and t_pyc >= t_py:
  504.         f = open(file, 'rb')
  505.         if f.read(4) == imp.get_magic():
  506.             t = struct.unpack('<I', f.read(4))[0]
  507.             if t == t_py:
  508.                 code = marshal.load(f)
  509.             
  510.         
  511.         f.close()
  512.     
  513.     if code is None:
  514.         file = filename
  515.         code = _compile(file, t_py)
  516.     
  517.     return (0, code, {
  518.         '__file__': file })
  519.  
  520.  
  521. class DynLoadSuffixImporter:
  522.     
  523.     def __init__(self, desc):
  524.         self.desc = desc
  525.  
  526.     
  527.     def import_file(self, filename, finfo, fqname):
  528.         fp = open(filename, self.desc[1])
  529.         module = imp.load_module(fqname, fp, filename, self.desc)
  530.         module.__file__ = filename
  531.         return (0, module, { })
  532.  
  533.  
  534.  
  535. def _print_importers():
  536.     items = sys.modules.items()
  537.     items.sort()
  538.     for name, module in items:
  539.         if module:
  540.             print name, module.__dict__.get('__importer__', '-- no importer')
  541.             continue
  542.         print name, '-- non-existent module'
  543.     
  544.  
  545.  
  546. def _test_revamp():
  547.     ImportManager().install()
  548.     sys.path.insert(0, BuiltinImporter())
  549.  
  550.